package com.cn.wanxi.service.impl;

import com.cn.wanxi.dao.UserDao;
import com.cn.wanxi.dao.impl.UserImpl;
import com.cn.wanxi.model.ResultModel;
import com.cn.wanxi.model.UserModel;
import com.cn.wanxi.service.UserService;
import sun.misc.BASE64Encoder;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.List;

public class UserServiceImpl implements UserService {

    /**
     * 这里每个方法里面都有一个调用dao层的代码，所以放入全局变量，并设为私有属性
     */
    private UserDao userDao = new UserImpl();

    @Override
    public ResultModel login(UserModel userModel) {
//        ResultModel resultModel = new ResultModel();
        String msg = "";
        if (userModel.getCode().equals(userModel.getSessionCode())) {
//            resultModel.setMsg("success");
//            调用数据实现层，根据用户名和密码去查询数据库，查看是否有值，
//            根据不同的返回值判断用户名或者密码是否正确
            UserDao userDao = new UserImpl();
//            如果新增用户的时候已经对密码加密了，
//            那么在登录时，必须对密码加密后在和数据库的密码进行对比
            userModel.setPassword(encodeByMD5(userModel.getPassword()));
            UserModel model = userDao.findByUsernameAndPassword(userModel);//从数据库里面查询数据
            if (model == null) {
                msg = "error";
            } else {
                msg = "success";
            }
        } else {
            msg = "error-code";
        }
//        resultModel.setCode(0);
//        resultModel.setCount(1000);
//        resultModel.setMsg("success");
//        resultModel.setData("error");
//        return resultModel;
        return ResultModel.getResultModel(msg);
    }

    @Override
    public ResultModel updateSex(UserModel userModel) {
        return ResultModel.getResultModel(userDao.updateSex(userModel));
    }

    @Override
    public ResultModel updateEnable(UserModel userModel) {
        return ResultModel.getResultModel(userDao.updateEnable(userModel));
    }

    @Override
    public ResultModel findAll(UserModel userModel) {

        return ResultModel.getResultModel(userDao.findAll(userModel), userDao.getCount(userModel));
    }

    @Override
    public ResultModel getCount(UserModel userModel) {
//        ResultModel resultModel = new ResultModel();
//
//        int count = userDao.getCount(userModel);
//        resultModel.setCount(count);
//        return resultModel;
        return ResultModel.getResultModel(userDao.getCount(userModel));
    }


    @Override
    public ResultModel findById(UserModel userModel) {
        return ResultModel.getResultModel(userDao.findById(userModel));
    }

    @Override
    public ResultModel delete(UserModel userModel) {
//        //        统一返回格式
//        ResultModel resultModel = new ResultModel();
////        调用数据持久层
//        UserDao userDao = new UserImpl();
////        得到删除结果
//        int count = userDao.delete(userModel);
////        将结果赋值到统一格式的data里面
//        resultModel.setData(count);
////        将同个返回的数据返回给页面控制层
//        return resultModel;
        return ResultModel.getResultModel(userDao.delete(userModel));
    }

    private static String encodeByMD5(String password) {
        try {
            //确定计算方法
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            BASE64Encoder base64en = new BASE64Encoder();
            //加密后的字符串
            return base64en.encode(md5.digest(password.getBytes("utf-8")));

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return "";

    }

//    public static void main(String[] args) {
////        4QrcOUm1Wau+VuBX8g+IPg==
//        System.out.println(encodeByMD5("123456"));
//    }

    @Override
    public ResultModel add(UserModel userModel) {
//        这里需要对密码进行加密
        String mingwen = userModel.getPassword();
        String anwen = encodeByMD5(mingwen);
        userModel.setPassword(anwen);
//        userModel.setPassword(encodeByMD5(userModel.getPassword()));
//        Java对密码加密的方式有很多种，最简单的是MD5

//        ResultModel resultModel = new ResultModel();
//        UserDao userDao = new UserImpl();
//        int count = userDao.add(userModel);
//        resultModel.setCount(count);
//        return resultModel;
        return ResultModel.getResultModel(userDao.add(userModel));
    }

    @Override
    public ResultModel update(UserModel userModel) {
        return ResultModel.getResultModel(userDao.update(userModel));
    }
}
